package com.huitong.common.satoken.handler;

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import cn.dev33.satoken.exception.SameTokenInvalidException;
import com.huitong.common.core.domain.Result;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import static org.springframework.http.HttpStatus.FORBIDDEN;
import static org.springframework.http.HttpStatus.UNAUTHORIZED;

/**
 * Sa-Token异常处理器
 *
 * @author fromdrowning
 * @date 2024/4/5 15:57
 */
@Slf4j
@RestControllerAdvice
public class SaTokenExceptionHandler {

    /**
     * 权限码异常处理
     *
     * @param e       权限码异常
     * @param request 请求
     * @return 状态码403 错误提示
     */
    @ExceptionHandler(NotPermissionException.class)
    public Result<Void> handleNotPermissionException(NotPermissionException e, HttpServletRequest request) {
        log.error("请求路径:{} 权限码校验失败:{}", request.getRequestURI(), e.getMessage());
        return Result.error(FORBIDDEN.value(), "没有访问权限");
    }

    /**
     * 角色权限异常处理
     *
     * @param e       角色权限异常
     * @param request 请求
     * @return 状态码403 错误提示
     */
    @ExceptionHandler(NotRoleException.class)
    public Result<Void> handleNotRoleException(NotRoleException e, HttpServletRequest request) {
        log.error("请求路径:{} 角色权限校验失败:{}", request.getRequestURI(), e.getMessage());
        return Result.error(FORBIDDEN.value(), "没有访问权限");
    }

    /**
     * 登录失败异常处理
     *
     * @param e       登录失败异常
     * @param request 请求
     * @return 状态码401 错误提示
     */
    @ExceptionHandler(NotLoginException.class)
    public Result<Void> handleNotLoginException(NotLoginException e, HttpServletRequest request) {
        log.error("请求路径:{} 登录失败:{}", request.getRequestURI(), e.getMessage());
        return Result.error(UNAUTHORIZED.value(), "登录失败");
    }

    /**
     * 无效认证异常处理
     *
     * @param e       无效认证异常
     * @param request 请求
     * @return 状态码401 错误提示
     */
    @ExceptionHandler(SameTokenInvalidException.class)
    public Result<Void> handleSameTokenInvalidException(SameTokenInvalidException e, HttpServletRequest request) {
        log.error("请求路径:{} 内网认证失败:{}", request.getRequestURI(), e.getMessage());
        return Result.error(UNAUTHORIZED.value(), "认证失败");
    }
}
